<template>
  <div class="contarner-page" @click.stop="showLanguageHandel">
    <page-header ref="languageRef"></page-header>
    <main>
      <div class="downloader flex_ccenter" v-if="!success">
        <div class="container">
          <div class="banner-heading flex_ccenter">
            <div class="heading-item">
              <h1 class="title fw700 f-42 c-fff">IGTV-Video-Downloader</h1>
              <h2 class="sub c-fff f-18 fw400">
                Laden Sie das Video IGTV von Instagram herunter
              </h2>
            </div>
          </div>
          <div class="form flex_center">
            <div class="input-box flex_between">
              <!-- <input
                      type="text"
                      class="input f-18"
                      v-model="input"
                      @input="handleInput"
                      @paste="handleInput"
                      placeholder="Paste URL Instagram"
                      list="fruits"
                      name="fruit"
                    />
                    <datalist id="fruits">
                      <option value="Apple"></option>
                      <option value="Banana"></option>
                      <option value="Cherry"></option>
                    </datalist> -->
              <input
                type="text"
                class="input f-18"
                v-model="input"
                :disabled="isHttpLoading"
                @input="handleInput"
                @paste="handleInput"
                @keydown="sendDownload($event)"
                placeholder="Paste URL Instagram"
              />
              <div
                class="Paste shou flex_center"
                @click="handleClickPasted"
                v-if="input == ''"
              >
                <div class="btnbg"></div>
                <div class="f-16 c-000 fw700">Paste</div>
              </div>
              <div
                class="clear shou flex_center"
                v-if="input != '' && !isHttpLoading"
                @click.stop="input = ''"
              >
                <div class="btnbg"></div>
                <div class="f-16 c-000 fw700">Clear</div>
              </div>
            </div>
            <div
              v-if="!isHttpLoading"
              @click.stop="downloadHandel"
              class="submit shou fw700 c-fff flex_center"
            >
              Download
            </div>
            <div v-else class="submit shou fw700 c-fff flex_center">
              Please wait
            </div>
          </div>
          <div class="app-submit flex_ccenter">
            <div
              class="submit flex_center"
              v-if="!isHttpLoading"
              @click.stop="downloadHandel"
            >
              <div class="fw700 c-fff f-21">Download</div>
            </div>
            <div class="submit flex_center" v-else>
              <div class="fw700 c-fff f-21">Please wait</div>
            </div>
          </div>
          <div class="loading" v-if="isHttpLoading">
            <div class="loading-dots flex_center">
              <div class="dot"></div>
              <div class="dot"></div>
              <div class="dot"></div>
              <div class="dot"></div>
            </div>
            <div class="tips f-18 flex_center">
              <div>
                Daten werden abgerufen, bitte warten Sie ein paar Sekunden!
              </div>
            </div>
          </div>
          <div class="error flex_ccenter" v-if="httpError1">
            <div class="hono flex_">
              <div class="error-img"></div>
              <div class="error-img"></div>
              <div class="error-img"></div>
            </div>
            <div class="errMsg f-18">
              Die Website kann Ihren Link nicht verarbeiten, da er privat ist
            </div>
          </div>
          <div class="error flex_ccenter" v-if="httpError2">
            <div class="hono flex_">
              <div class="error-img"></div>
              <div class="error-img"></div>
              <div class="error-img"></div>
            </div>
            <div class="errMsg f-18">
              Bei den von Ihnen eingegebenen Daten handelt es sich nicht um
              einen Link. Bitte geben Sie einen gültigen Link ein Beispiel:
              <div>https://www.instagram.com/reel/Cml9qu-ISqx</div>
            </div>
          </div>
        </div>
      </div>
      <!-- 广告位start -->
      <!-- 广告位end -->
      <div class="container" v-if="!success">
        <div class="body-content">
          <div class="app-box">
            <div class="app-box__info">
              <h3 class="app-box__title f-21 fw700 c-000">
                Mit der App Insta Downloader herunterladen
              </h3>
              <p class="f-16 c-ccc">
                Unsere App bietet eine schnelle und einfache Lösung zum Herunterladen
                 Instagram-Videos, Bereitstellung von Videos in HD-Qualität ohne
                 Wasserzeichen.
              </p>
            </div>
            <div class="app-link">
              <a 
                  target="_blank" href="https://play.google.com/store/apps/details?id=ins.freevideodownload.pro">
                <img src="/static/images/google-play.webp" alt="Download app " />
              </a>
              <a href="https://apps.apple.com/us/app/repost-for-video-save-story/id6462401460"  target="_blank">
                <img src="/static/images/IOS.webp" alt="Download app " />
              </a>
            </div>
          </div>
          <div class="quick-info">
            <h3 class="f-32 c-000">Was ist ein Video-Downloader für IGTV?</h3>
            <p class="f-16 c-ccc">
              Laden Sie IGTV-Videos in höchster Qualität auf Ihr iPad, Ihren PC oder herunter
               Telefon. Nutzen Sie Ihren Browser, um Videos von Instagram herunterzuladen.
               Es muss keine Software installiert werden. unterstützt sowohl iOS als auch Android.
            </p>
          </div>
          <div class="quick-info">
            <h3 class="f-32 c-000 using italic">
              Wie kann ich ein Instagram-Video von IGTV herunterladen?
            </h3>
            <div class="quick-info-title">
              Es ist ganz einfach. Nachfolgend finden Sie unseren ausführlichen Leitfaden.
            </div>
            <ul class="f-16">
              <li>
                Öffnen Sie Instagram in Ihrem Webbrowser (Chrome, Firefox, Internet).
                 Explorer usw.).
              </li>
              <li>Klicken Sie beim gewünschten Konto auf IGTV.</li>
              <li>Klicken Sie auf das Video, das Sie speichern möchten.</li>
              <li>
                Um ein Video von IGTV herunterzuladen, kopieren Sie die Video-URL von
                 Adressleiste und fügen Sie es in die Savinginsta.com-Adresse ein.
              </li>
              <li>Klicken Sie auf „Herunterladen“ und wählen Sie den Server aus.</li>
              <li>Erfolg! Ihr IGTV-Video befindet sich jetzt im Ordner.</li>
            </ul>
          </div>
          <div class="faq-section">
            <h3 class="faq-title f-36 c-000 italic">FAQ</h3>
            <div class="accordion">
              <div
                id="faq"
                itemscope="itemscope"
                itemtype="https://schema.org/FAQPage"
              >
                <div
                  itemprop="mainEntity"
                  itemscope="itemscope"
                  itemtype="https://schema.org/Question"
                  class="accordion-item"
                  :key="k"
                  v-for="(item, k) in faqList"
                >
                  <h4 itemprop="name" class="accordion-title fw700 f-16">
                    {{ item.title }}
                  </h4>
                  <div
                    itemprop="acceptedAnswer"
                    itemscope=""
                    itemtype="https://schema.org/Answer"
                  >
                    <div
                      itemprop="text"
                      class="accordion-text f-16 c-ccc fw400"
                    >
                      {{ item.content }}
                    </div>
                  </div>
                </div>
              </div>
            </div>
          </div>
        </div>
      </div>
      <!-- 解析结果 start -->
      <div class="container" v-if="success">
        <success-content
          @refresh="refresh"
          :list="successList"
        ></success-content>
      </div>
      <!-- 解析结果 end -->
    </main>
    <footer>
      <div class="container">
        <div class="footer-content">
          <div class="footer-link">
            <div class="row flex_between">
              <div class="col-12">
                <div class="link-label fw700 c-000 f-21">Werkzeuge</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/de/instagram-story-download"
                      >Instagram-Story-Downloader</nuxt-link
                    >
                  </li>
                  <li>
                    <nuxt-link to="/de/instagram-reels-video-download"
                      >Instagram-Reels-Downloader</nuxt-link
                    >
                  </li>
                  <li>
                    <a href="https://savingtik.com/" target="_blank"
                      >Tiktok-Downloader</a
                    >
                  </li>
                </ul>
              </div>
              <div class="col-6">
                <div class="link-label fw700 c-000 f-21">Unterstützung</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/contact"> Kontakt </nuxt-link>
                  </li>
                  <li>
                    <nuxt-link to="/blog"> Blog </nuxt-link>
                  </li>
                </ul>
              </div>
              <div class="col-6">
                <div class="link-label fw700 c-000 f-21">Legal</div>
                <ul class="list-unstyled c-ccc f-16">
                  <li>
                    <nuxt-link to="/terms-of-service">
                      Nutzungsbedingungen
                    </nuxt-link>
                  </li>
                  <li>
                    <nuxt-link to="/privacy-policy"> Datenschutzrichtlinie </nuxt-link>
                  </li>
                </ul>
              </div>
            </div>
          </div>
          <div class="copyright flex_ccenter">
            <b class="fw700 f-21 c-000"
              >Wir sind nicht mit Instagram oder Meta verbunden</b
            >
            <div class="c-ccc f-16">
              © {{new Date().getFullYear()}} Insta Downloader All rights reserved.
            </div>
          </div>
        </div>
      </div>
    </footer>
  </div>
</template>
      
<script>
import { mapState, mapGetters, mapMutations } from "vuex";
import pageHeader from "~/components/page-header.vue";
import SuccessContent from "~/components/success-content.vue";
import CryptoJS from "crypto-js";
import { handleClick, checkString } from "@/plugins/Firebase.js";
export default {
  components: { pageHeader, SuccessContent },
  head: {
    htmlAttrs: {
      lang: "de",
    },
    bodyAttrs: {
      "data-lang": "de",
    },
    title: "Bester kostenloser Instagram IGTV-Video-Downloader",
    meta: [
      { property: "og:locale", content: "de" },
      //Page Information
      {
        name: "description",
        content:
          "Savinginsta.com ist der beste Instagram-Video-Downloader, der Ihnen dabei hilft, hochwertige IGTV-Videos mit der schnellsten Download-Geschwindigkeit auf Ihr Gerät herunterzuladen.",
      },

      //Schema.org Microdata
      {
        itemprop: "name",
        content: "Bester kostenloser Instagram IGTV-Video-Downloader",
      },

      // Facebook / OpenGraph
      {
        property: "og:title",
        content: "Bester kostenloser Instagram IGTV-Video-Downloader",
      },
      { property: "og:type", content: "website" },
      { property: "og:url", content: "https://savinginsta.com/de/igtv-downloader" },

      {
        property: "og:description",
        content:
          "Savinginsta.com ist der beste Instagram-Video-Downloader, der Ihnen dabei hilft, hochwertige IGTV-Videos mit der schnellsten Download-Geschwindigkeit auf Ihr Gerät herunterzuladen.",
      },
      //Twitter
      { name: "twitter:card", content: "summary" },
      { name: "twitter:url", content: "https://savinginsta.com/de/igtv-downloader" },
      {
        name: "twitter:title",
        content: "Bester kostenloser Instagram IGTV-Video-Downloader",
      },
      {
        name: "twitter:description",
        content:
          "Savinginsta.com ist der beste Instagram-Video-Downloader, der Ihnen dabei hilft, hochwertige IGTV-Videos mit der schnellsten Download-Geschwindigkeit auf Ihr Gerät herunterzuladen.",
      },
      //multilingual
      {
        name: "google",
        content: "notranslate",
      },
    ],
    link: [
      //multilingual
      {
        rel: "alternate",
        hreflang: "x-default",
        href: "https://savinginsta.com/de/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "en",
        href: "https://savinginsta.com/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "en-in",
        href: "https://savinginsta.com/in/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "vi",
        href: "https://savinginsta.com/vn/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "tr",
        href: "https://savinginsta.com/tr/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "id",
        href: "https://savinginsta.com/id/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "fr",
        href: "https://savinginsta.com/fr/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "pt",
        href: "https://savinginsta.com/pt/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "ru",
        href: "https://savinginsta.com/ru/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "es",
        href: "https://savinginsta.com/es/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "ms",
        href: "https://savinginsta.com/ms/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "ko",
        href: "https://savinginsta.com/ko/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "ja",
        href: "https://savinginsta.com/ja/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "jv",
        href: "https://savinginsta.com/jv/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "cs",
        href: "https://savinginsta.com/cs/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "de",
        href: "https://savinginsta.com/de/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "it",
        href: "https://savinginsta.com/it/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "pl",
        href: "https://savinginsta.com/pl/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "hu",
        href: "https://savinginsta.com/hu/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "nl",
        href: "https://savinginsta.com/nl/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "ro",
        href: "https://savinginsta.com/ro/igtv-downloader",
      },
      {
        rel: "alternate",
        hreflang: "el",
        href: "https://savinginsta.com/el/igtv-downloader",
      },
      {
        rel: "canonical",
        href: "https://savinginsta.com/de/igtv-downloader",
      },
    ],
    script: [
      {
        json: {
          "@context": "http://schema.org",
          "@graph": [
            {
              "@type": "WebSite",
              name: "Savinginsta",
              alternateName: "Instagram downloader",
              url: "https://savinginsta.com",
            },
            {
              "@type": "WebPage",
              name: "Bester kostenloser Instagram IGTV-Video-Downloader", //title
              inLanguage: "de", //语种
              description:
                "Savinginsta.com ist der beste Instagram-Video-Downloader, der Ihnen dabei hilft, hochwertige IGTV-Videos mit der schnellsten Download-Geschwindigkeit auf Ihr Gerät herunterzuladen.", //元描述
              image: "https://savinginsta.com/static/images/savinginsta_thumbnail.jpg", //绝对路径
              url: "https://savinginsta.com/de/igtv-downloader", //当前url
            },
          ],
        },
        type: "application/ld+json",
      },
    ],
  },
  data() {
    return {
      input: "",
      success: false,
      isHttpLoading: false,
      httpError1: false,
      httpError2: false,
      current: 0,
      successList: [],
      faqList: [
        {
          title: `Ist es frei?`,
          content: `Es wird nie berechnet. Nur ein kleiner Teil unserer Anzeigen dient der Finanzierung unseres Wachstums.`,
        },
        {
          title: `Ist es notwendig, sich mit Ihren Instagram-Zugangsdaten anzumelden?`,
          content: `Nein, Sie müssen sich nicht bei Ihrem Konto anmelden, um sicher und privat etwas von Instagram herunterzuladen. Savinginsta fordert keine persönlichen Daten von Benutzern an.`,
        },
        {
          title: `Muss ich für das Herunterladen von IGTV einen Preis zahlen?`,
          content: `Nutzen Sie den Instagram IGTV Downloader, ohne sich Gedanken über Konsequenzen machen zu müssen. Auf Instagram veröffentlichte Beiträge haben das Recht, offline verwendet zu werden.`,
        },
        {
          title: `Wie kann ich die IGTV-App von Instagram auf mein iPhone laden?`,
          content: `Aus diesem Grund haben wir ein ausführliches Tutorial, das erklärt, wie Sie IGTV-Videos auf Ihr iPhone oder iPad herunterladen. Klicken Sie einfach auf diesen Link. Holen Sie sich IGTV-Video-Downloads für das iPhone.`,
        },
        {
          title: `Wo werden die Videos von IGTV auf meinem Computer gespeichert?`,
          content: `Verwenden Sie diese Tastenkombinationen, um den Download-Verlauf Ihres Browsers anzuzeigen: Drücken Sie unter Windows Strg + J; Verwenden Sie auf einem Mac Umschalt + Befehl + J.`,
        },
      ],
    };
  },
  computed: {
    ...mapGetters(["language"]),
  },
  mounted() {
    this.debouncedDownInput = this.debounce(this.downInput, 1000);
  },
  methods: {
    async downloadHandel() {
      if (this.isHttpLoading || this.input === "") return;
      this.isHttpLoading = false;
      this.httpError1 = false;
      this.httpError2 = false;
      this.input = this.input.replace(/^.*\s?https:\/\//, "https://");
      let type = checkString(this.input);
      const insUrlPattern = new RegExp("^http(s|)://.*instagram.com.*/.*$");
      if (!insUrlPattern.test(this.input)) {
        //点击解析下载按钮
        handleClick("action_ins_detect_boinsom", {
          site: "other",
          noislink: this.input,
          from: "igtv",
          type: type,
        });
        this.httpError2 = true;
        this.isHttpLoading = false;
        return;
      }
      //点击解析下载按钮
      handleClick("action_ins_detect_boinsom", {
        site: "other",
        from: "igtv",
        type: type,
      });
      //开始解析  ins_start_resolve
      handleClick("ins_start_resolve", {
        islink: this.input,
        from: "igtv",
        type: type,
      });
      this.isHttpLoading = true;
      try {
        let result = this.uki(this.input);
        const response = await fetch(
          "https://savinginsta.com/api/downloader/analysis",
          {
            method: "POST",
            headers: { "Content-Type": "application/json" },
            body: JSON.stringify({
              path: result,
            }),
          }
        );
        let encryptedResponse = await response.text();
        let parse = JSON.parse(encryptedResponse);
        if (parse.code != 200) {
          // 解析失败  ins_resolve_fail
          handleClick("ins_resolve_fail", {
            reason: "Failed to fetch",
            islink: this.input,
            from: "igtv",
            type: type,
          });
          this.httpError1 = true;
          this.isHttpLoading = false;
          return;
        } else {
          //解析成功  ins_resolve_success
          handleClick("ins_resolve_success", {
            type: type,
            from: "video",
          });
          let decryptedResponse = await this.eki(parse.data); // 使用你的解密函数
          this.successList = JSON.parse(decryptedResponse);
          this.success = true;
          this.isHttpLoading = false;
        }
      } catch (error) {
        // 解析失败  ins_resolve_fail
        handleClick("ins_resolve_fail", {
          reason: "Failed to fetch",
          islink: this.input,
          from: "igtv",
          type: type,
        });
        console.error(error);
        this.httpError1 = true;
        this.isHttpLoading = false;
      }
    },

    uki(input) {
      let CIPHER_ALGORITHM = "DES-CBC";
      let IV_SIZE = 8;
       
      
  try {
        const complexKey = [
          process.env.part1,
          process.env.part2,
          process.env.part3,
          process.env.part4,
          process.env.part5,
          process.env.part6,
          process.env.part7,
          process.env.part8,
        ].join("");
        const keyBytes = CryptoJS.enc.Utf8.parse(complexKey);
        const inputBytes = CryptoJS.enc.Utf8.parse(input);
        const ivBytes = CryptoJS.lib.WordArray.random(IV_SIZE);
        const encrypted = CryptoJS.DES.encrypt(inputBytes, keyBytes, {
          iv: ivBytes,
          mode: CryptoJS.mode.CBC,
          padding: CryptoJS.pad.Pkcs7,
        });
        const ciphertext = ivBytes.concat(encrypted.ciphertext);
        return ciphertext.toString();
      } catch (error) {
        console.error(error);
        return null;
      }
    },
    eki(cipherText) {
      let CIPHER_ALGORITHM = "DES-CBC";
      let IV_SIZE = 8;
       
      const complexKey = [
          process.env.part1,
          process.env.part2,
          process.env.part3,
          process.env.part4,
          process.env.part5,
          process.env.part6,
          process.env.part7,
          process.env.part8,
        ].join("");
      try {
        let keyBytes = CryptoJS.enc.Utf8.parse(
          complexKey.padEnd(CIPHER_ALGORITHM === "DES-CBC" ? 8 : 16)
        );
        let ivBytes = { iv: CryptoJS.enc.Hex.parse(process.env.DES_IV) }; // 如果使用CBC模式，需要一个初始化向量iv，这里是空向量
        let decrypted = CryptoJS.DES.decrypt(
          { ciphertext: CryptoJS.enc.Hex.parse(cipherText) },
          keyBytes,
          ivBytes
        );
        return decrypted.toString(CryptoJS.enc.Utf8);
      } catch (e) {
        console.error(e);
        return null;
      }
    },
    sendDownload(event) {
      if (event.keyCode === 13 && !this.isHttpLoading) {
        this.downloadHandel();
        event.preventDefault();
        return false;
      }
    },
    changeTab(k) {
      this.current = k;
    },
    handleInput(e) {
      this.debouncedDownInput(e);
    },
    debounce(fn, delay) {
      let timer;
      return function () {
        let context = this;
        let args = arguments;
        clearTimeout(timer);
        timer = setTimeout(() => {
          fn.apply(context, args);
        }, delay);
      };
    },
    downInput(e) {
      let type = checkString(e.target.value);
      // 粘贴链接到输入框 action_ins_paste
      handleClick("action_ins_paste", {
        islink: e.target.value,
        from: "igtv",
        type: type,
      });
    },
    handleClickPasted() {
      if (!navigator.clipboard) {
        console.log("Clipboard API not available");
        return;
      }
      navigator.clipboard
        .readText()
        .then((text) => {
          this.input = text;
          let type = checkString(text);
          // 粘贴链接到输入框 action_ins_paste
          handleClick("action_ins_paste", {
            islink: text,
            from: "igtv",
            type: type,
          });
        })
        .catch((err) => {
          console.error("Failed to read clipboard contents: ", err);
        });
    },
    showLanguageHandel() {
      this.$refs.languageRef.close();
    },
    refresh() {
      this.success = false;
      this.input = "";
      this.successList = [];
    },
  },
};
</script>
<style lang="scss" scoped>
@import "@/static/style/ig.css";
.loading {
  .loading-dots {
    position: relative;
    z-index: 999;
    margin-top: 70px;
  }

  .dot {
    background-color: #ffffff;
    width: 12px;
    height: 12px;
    border-radius: 50%;
    margin: 0 10px;
    animation: loading-animation 1.5s infinite;
  }

  .dot:nth-child(2) {
    animation-delay: 0.5s;
  }

  .dot:nth-child(3) {
    animation-delay: 0.8s;
  }
  .dot:nth-child(4) {
    animation-delay: 1s;
  }
}
@keyframes loading-animation {
  0%,
  50%,
  80%,
  100% {
    transform: scale(1);
  }
  40% {
    transform: scale(1.5);
  }
}
@media (max-width: 768px) {
  .loading {
    .loading-dots {
      margin-top: 26px !important;
    }
    .dot {
      width: 8px !important;
      height: 8px !important;
    }
  }
}
</style>
      